home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok52
/
oberonced
/
obced.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
14KB
|
504 lines
(***************************************************************************
:Program. ObCED.mod
:Contents. Communication with CED
:Author. Achim Siebert
:Address. Nobileweg 67 , 7000 Stuttgart 40
:Copyright. Public Domain
:Language. Oberon
:Translator. AmigaOberon A+L
:Imports. CED, Req
:History. Jan-1991; V1.3
:Usage. ObCED c-[svbcrntmd1238ig] l-[bsmdi]
ObCED [c][l][e][opt] | [next] | [prev] | [first] | [quit]
****************************************************************************)
MODULE ObCED;
IMPORT
Req,
ExecSupport,
FileSystem,
I:Intuition,
Dos,
SecureDos,
s:SYSTEM,
Exec,
Strings,
Arguments,
CED;
VAR OldFile,PathFile: ARRAY Req.dsize+Req.fchars+8 OF CHAR;
ThisFile,ExecuteFile,EFile : ARRAY Req.fchars+8 OF CHAR;
doscommand : ARRAY Req.dsize+6 OF CHAR;
oldcompoptions,oldlinkoptions,compoptions,linkoptions,
compdef,linkdef : ARRAY 30 OF CHAR;
tfile,errfile : FileSystem.File;
same,errfileopen,errorsYetLoaded,egalerror : BOOLEAN;
Ausgabefenster : Dos.FileHandlePtr;
i,fehleraktuell,fehlergesamt : INTEGER;
numlines : LONGINT;
msp, foundmsp, replmsp : Exec.MsgPortPtr;
OldDir,NewDir,DummyDir : Dos.FileLockPtr;
mymess : CED.CEDMsg;
mymessPtr : POINTER TO CED.CEDMsg;
msgstring : ARRAY 8 OF CHAR;
msgstringPtr : POINTER TO ARRAY 8 OF CHAR;
optionen : SHORTSET;
CONST c = 0; l = 1; e = 2; opt = 3; next = 4; prev = 5; first = 6; quit = 7;
fehleranzahl = 170;
front = "cedtofront";
myportname = "OB_CED";
tfilename = "T:ObCED.Workfile";
VAR Fehler : POINTER TO ARRAY fehleranzahl OF ARRAY 70 OF CHAR;
PROCEDURE Halt;
BEGIN
HALT(20);
END Halt;
PROCEDURE PutCED(command : ARRAY OF CHAR);
BEGIN
IF NOT CED.PutMsg(command) THEN Halt END;
END PutCED;
PROCEDURE GetFirstArgs():BOOLEAN;
VAR k : INTEGER;
BEGIN
i := Arguments.NumArgs();
k := 1;
LOOP
IF k > i THEN
RETURN TRUE;
END;
Arguments.GetArg(k,doscommand);
IF doscommand[1] = "-" THEN
CASE doscommand[0] OF
"c","l":
IF doscommand[0] = "c" THEN
COPY(doscommand,compdef);
Strings.Delete(compdef,0,1);
Strings.AppendChar(compdef," ");
ELSE
COPY(doscommand,linkdef);
Strings.Delete(linkdef,0,1);
Strings.AppendChar(linkdef," ");
END;
ELSE
RETURN FALSE;
END;
ELSE
RETURN FALSE;
END;
INC(k);
END;
END GetFirstArgs;
PROCEDURE GetArgs():BOOLEAN;
BEGIN
i := Arguments.NumArgs();
IF i = 1 THEN
Arguments.GetArg(1,msgstring);
Strings.Upper(msgstring);
RETURN TRUE;
END;
RETURN FALSE;
END GetArgs;
PROCEDURE Auswertung():BOOLEAN;
PROCEDURE Occurs(what: ARRAY OF CHAR):BOOLEAN;
BEGIN
RETURN Strings.Occurs(msgstring,what) # -1;
END Occurs;
BEGIN
optionen := SHORTSET{};
IF Occurs("NEXT") THEN INCL(optionen,next); RETURN TRUE;END;
IF Occurs("FIRST") THEN INCL(optionen,first);RETURN TRUE;END;
IF Occurs("PREV") THEN INCL(optionen,prev); RETURN TRUE;END;
IF Occurs("QUIT") THEN INCL(optionen,quit); RETURN TRUE;END;
IF Occurs("OPT")THEN INCL(optionen,opt); END;
IF Occurs("C") THEN INCL(optionen,c); END;
IF Occurs("L") THEN INCL(optionen,l); END;
IF Occurs("E") THEN INCL(optionen,e); END;
IF (c IN optionen) OR (l IN optionen) OR (e IN optionen) THEN RETURN TRUE;
ELSE RETURN FALSE END;
END Auswertung;
PROCEDURE CloseErrfile();
BEGIN
IF errfileopen THEN
IF NOT FileSystem.Close(errfile) THEN Halt; END;
errfileopen := FALSE;
END;
END CloseErrfile;
PROCEDURE LadeFehler();
CONST fehlerfilename = "OBERON:Fehler-Meldungen";
BEGIN
NEW(Fehler); IF Fehler = NIL THEN Halt END;
IF NOT FileSystem.Open(errfile,fehlerfilename,FALSE) THEN
PutCED("Okay1 OBERON:Fehler-Meldungen nicht gefunden!");
ELSE
errfileopen := TRUE;
i := 0;
LOOP
IF NOT FileSystem.ReadString(errfile,Fehler[i]) THEN EXIT; END;
INC(i); IF i = fehleranzahl THEN EXIT END;
END;
CloseErrfile;
END;
END LadeFehler;
PROCEDURE ZeigeFehler(fnp:INTEGER);
TYPE Fehlerblock = STRUCT
nummer,zeile,spalte : INTEGER;
END;
VAR fehlrec : Fehlerblock;
PROCEDURE ShowErr();
TYPE Jumptoblock = STRUCT
int1,int2 : INTEGER;
END;
VAR jumprec : Jumptoblock;
BEGIN
jumprec.int1 := fehlrec.zeile;
jumprec.int2 := fehlrec.spalte;
IF Req.Format(doscommand,"Jumpto %d %d",s.ADR(jumprec))#0 THEN END;
PutCED(doscommand);
PutCED("left");
jumprec.int1 := fehleraktuell;
jumprec.int2 := fehlergesamt;
IF Req.Format(doscommand,"Okay1 Fehler Nr. %d von %d:\n",s.ADR(jumprec))#0 THEN END;
Strings.Append(doscommand,Fehler[fehlrec.nummer]);
PutCED(doscommand);
END ShowErr;
BEGIN
IF NOT errorsYetLoaded THEN LadeFehler; errorsYetLoaded := TRUE; END;
IF fnp = first THEN
CloseErrfile;
IF FileSystem.Open(errfile,EFile,FALSE) THEN
errfileopen := TRUE;
fehlergesamt := SHORT(FileSystem.Size(errfile) DIV 6);
ELSE
Halt;
END;
END;
IF CED.GetNumber("Status 17") # numlines THEN
PutCED("okay1 Anzahl der Zeilen im File hat sich geändert!\nKorrekte Fehleranzeige nicht mehr möglich.");
RETURN;
END;
CASE fnp OF
first : fehleraktuell := 1;
IF FileSystem.Move(errfile,0) AND FileSystem.Read(errfile,fehlrec) THEN
IF (fehlergesamt = 1) AND (fehlrec.nummer=96) THEN
egalerror := TRUE;
ELSE
PutCED(front);
ShowErr();
END;
ELSE Halt;
END;
|next : INC(fehleraktuell);
IF fehleraktuell <= fehlergesamt THEN
IF NOT FileSystem.Read(errfile,fehlrec) THEN Halt END;
ShowErr();
ELSE
PutCED("okay1 Keine weiteren Fehler!");
DEC(fehleraktuell);
END;
|prev : DEC(fehleraktuell);
IF fehleraktuell <= 0 THEN
PutCED("okay1 Keine vorausgehenden Fehler!");
IF NOT FileSystem.Move(errfile,0) THEN Halt END;
fehleraktuell := 0;
ELSE
IF FileSystem.Move(errfile,(fehleraktuell-1)*6) THEN
IF NOT FileSystem.Read(errfile,fehlrec) THEN Halt END;
ShowErr();
ELSE Halt;
END;
END;
ELSE
END;
END ZeigeFehler;
PROCEDURE MakeExecuteTFile();
VAR Eingabe : Dos.FileHandlePtr;
BEGIN
IF NOT (FileSystem.Open(tfile,tfilename,TRUE) AND
FileSystem.WriteString(tfile,"Path OBERON: add\nStack 30000") AND
FileSystem.WriteString(tfile,doscommand) AND
FileSystem.WriteString(tfile,"Stack 4000") AND
FileSystem.Close(tfile)) THEN Halt END;
Eingabe := Dos.Open(tfilename,Dos.oldFile);
IF Eingabe = NIL THEN Halt; END;
IF NOT Dos.Execute("",Eingabe,Ausgabefenster) THEN Dos.Close(Eingabe); Halt; END;
Dos.Close(Eingabe);
IF Dos.DeleteFile(tfilename) THEN END;
END MakeExecuteTFile;
PROCEDURE Action();
PROCEDURE FensterZu();
BEGIN
PutCED(front);
Dos.Close(Ausgabefenster); Ausgabefenster := NIL;
END FensterZu;
BEGIN
IF quit IN optionen THEN HALT(0);END;
IF c IN optionen THEN
OldFile := "";
CloseErrfile;
PutCED("Save ");
END;
same := FALSE;
CED.GetString("Status 19",PathFile);
Strings.Upper(PathFile);
IF (Strings.Occurs(PathFile,".MOD") = -1) THEN RETURN END;
IF PathFile = OldFile THEN same := TRUE ELSE OldFile := PathFile END;
IF NOT same THEN
numlines := CED.GetNumber("Status 17"); IF numlines = 0 THEN RETURN END;
CED.GetString("Status 21",ThisFile); IF ThisFile = "" THEN Halt END;
PathFile := "";
CED.GetString("Status 20",PathFile);
Strings.Upper(PathFile);
EFile := ThisFile;
Strings.AppendChar(EFile,"E");
IF Strings.Occurs(PathFile,":") = -1 THEN
CED.GetString("Status 75",doscommand);
Strings.Insert(PathFile,0,doscommand);
END;
IF Strings.OccursPos(PathFile,"/TXT",Strings.Length(PathFile)-4) # -1 THEN
Strings.Delete(PathFile,Strings.Length(PathFile)-4,4);
Strings.Insert(EFile,0,"txt/");
ELSE
IF Strings.OccursPos(PathFile,":TXT",Strings.Length(PathFile)-4) # -1 THEN
Strings.Delete(PathFile,Strings.Length(PathFile)-3,3);
Strings.Insert(EFile,0,"txt/");
END;
END;
CloseErrfile;
DummyDir := Dos.CurrentDir(OldDir);
IF NewDir # NIL THEN SecureDos.UnLock(NewDir);END;
NewDir := SecureDos.Lock(PathFile,Dos.sharedLock);
IF NewDir = NIL THEN Halt END;
DummyDir := Dos.CurrentDir(NewDir);
END;
IF (c IN optionen) OR (l IN optionen) OR (e IN optionen) THEN
compoptions := compdef; linkoptions := linkdef;
IF (c IN optionen) AND (opt IN optionen) THEN
IF oldcompoptions # "" THEN
compoptions := oldcompoptions;
ELSE compoptions := "svbcrntmdg1238io";
END;
PutCED(front);
doscommand := "getstring ";
Strings.Append(doscommand,compoptions);
Strings.Append(doscommand," Compiler-Optionen:");
CED.GetString(doscommand,compoptions);
IF compoptions # "" THEN
oldcompoptions := compoptions;
Strings.Insert(compoptions,0,"-");
Strings.AppendChar(compoptions," ");
END;
END;
IF (l IN optionen) AND (opt IN optionen) THEN
IF oldlinkoptions # "" THEN
linkoptions := oldlinkoptions;
ELSE
linkoptions := "";
IF (c IN optionen) AND (compoptions # "") THEN
Strings.Upper(compoptions);
IF Strings.Occurs(compoptions,"M") # -1 THEN
linkoptions := "m";
END;
IF Strings.Occurs(compoptions,"D") # -1 THEN
Strings.AppendChar(linkoptions,"d");
END;
IF Strings.Occurs(compoptions,"I") # -1 THEN
Strings.AppendChar(linkoptions,"i");
END;
END;
END;
IF linkoptions = "" THEN linkoptions := "bs" END;
PutCED(front);
doscommand := "getstring ";
Strings.Append(doscommand,linkoptions);
Strings.Append(doscommand," Linker-Optionen:");
CED.GetString(doscommand,linkoptions);
IF linkoptions # "" THEN
oldlinkoptions := linkoptions;
Strings.Insert(linkoptions,0,"-");
Strings.AppendChar(linkoptions," ");
END;
END;
Ausgabefenster := Dos.Open("CON:20/0/600/200/OBCed<->CED",Dos.newFile);
IF Ausgabefenster = NIL THEN Halt END;
IF I.WBenchToFront() THEN END;
IF (c IN optionen) THEN
doscommand := "Oberon ";
Strings.Append(doscommand,compoptions);
Strings.Append(doscommand,ThisFile);
MakeExecuteTFile();
IF FileSystem.Exists(EFile) THEN
egalerror := FALSE;
ZeigeFehler(first); IF NOT egalerror THEN FensterZu;RETURN;END;
END;
END;
IF (l IN optionen) OR (e IN optionen) THEN
ExecuteFile := ThisFile;
Strings.Delete(ExecuteFile,Strings.Length(ExecuteFile)-4,4);
IF (l IN optionen) THEN
doscommand := "OLink ";
Strings.Append(doscommand,linkoptions);
Strings.Append(doscommand,ExecuteFile);
MakeExecuteTFile();
END;
IF (e IN optionen) THEN
IF (opt IN optionen) THEN
doscommand := "getstring ";
Strings.Append(doscommand,ExecuteFile);
Strings.Append(doscommand," Programm-Aufruf:");
PutCED(front);
CED.GetString(doscommand,doscommand);
IF doscommand # "" THEN
IF I.WBenchToFront() THEN END;
IF Dos.Execute(doscommand,NIL,Ausgabefenster) THEN
FensterZu; RETURN;
ELSE Halt;
END;
ELSE FensterZu; RETURN;
END;
ELSE
IF Dos.Execute(ExecuteFile,NIL,Ausgabefenster) THEN
FensterZu; RETURN;
ELSE Halt;
END;
END;
ELSE FensterZu; RETURN;
END;
ELSE
FensterZu; RETURN;
END;
ELSE
IF FileSystem.Exists(EFile) THEN
IF (next IN optionen) AND same THEN ZeigeFehler(next);
ELSIF (prev IN optionen) AND same THEN ZeigeFehler(prev);
ELSE ZeigeFehler(first);
END;
ELSE
PutCED(front);
PutCED("okay1 Keine Fehlerdatei gefunden!");RETURN;
END;
END;
END Action;
BEGIN
optionen := SHORTSET{};
foundmsp := Exec.FindPort(myportname);
IF foundmsp=NIL THEN
msp := ExecSupport.CreatePort(myportname,0);
IF msp = NIL THEN Halt END;
OldDir := SecureDos.oldCurrentDir;
IF OldDir = NIL THEN Halt END;
errfileopen := FALSE; errorsYetLoaded := FALSE;
fehleraktuell := 1;
IF NOT GetFirstArgs() THEN Halt();END;
LOOP
msgstring := "";
REPEAT
Exec.WaitPort(msp);
mymessPtr := Exec.GetMsg(msp);
UNTIL mymessPtr # NIL;
IF mymessPtr^.args[0] # NIL THEN
msgstringPtr := mymessPtr.args[0];
IF msgstringPtr # NIL THEN
COPY(msgstringPtr^,msgstring);
END;
END;
Exec.ReplyMsg(mymessPtr);
IF Auswertung() THEN
Action();
END;
END;
ELSE
replmsp := ExecSupport.CreatePort("",0);
IF replmsp = NIL THEN Halt END;
mymess.cmNode.node.type:=Exec.message;
mymess.cmNode.length:=s.SIZE(CED.CEDMsg);
mymess.cmNode.replyPort:=replmsp;
IF NOT GetArgs() THEN msgstring := "QUIT";END;
NEW(msgstringPtr);
IF msgstringPtr = NIL THEN Halt END;
mymess.args[0] := msgstringPtr;
COPY(msgstring,msgstringPtr^);
Exec.PutMsg(foundmsp,s.ADR(mymess));
Exec.WaitPort(replmsp);
ExecSupport.DeletePort(replmsp);
DISPOSE(msgstringPtr);
END;
CLOSE
CloseErrfile;
IF NewDir # NIL THEN SecureDos.UnLock(NewDir);END;
IF msp # NIL THEN ExecSupport.DeletePort(msp);END;
IF Ausgabefenster # NIL THEN Dos.Close(Ausgabefenster) END;
END ObCED.